package com.ryder.petmatediarybackend.common.response;

import com.ryder.petmatediarybackend.common.enums.ResultCode;
import lombok.Data;

/**
 * 描述: 响应结果封装实体（遵循阿里规范）
 *
 * @author Ryder
 * @version 1.0
 * @since 1.0
 * 更新日期: 2025/10/28
 */
@Data
public class Result<T> {

    /**
     * 响应状态码
     */
    private Integer code;

    /**
     * 响应消息
     */
    private String message;

    /**
     * 响应数据
     */
    private T data;

    /**
     * 时间戳
     */
    private Long timestamp;

    // ==================== 成功响应 ====================

    /**
     * 成功响应（无数据）
     */
    public static <T> Result<T> ok() {
        return ok(null);
    }

    /**
     * 成功响应（带数据）
     */
    public static <T> Result<T> ok(T data) {
        return build(ResultCode.SUCCESS, data);
    }

    /**
     * 成功响应（自定义消息）
     */
    public static <T> Result<T> ok(String message) {
        return build(ResultCode.SUCCESS.getCode(), message, null);
    }

    /**
     * 成功响应（自定义消息 + 数据）
     */
    public static <T> Result<T> ok(String message, T data) {
        return build(ResultCode.SUCCESS.getCode(), message, data);
    }

    // ==================== 失败响应 ====================

    /**
     * 失败响应（使用枚举）
     */
    public static <T> Result<T> fail(ResultCode resultCode) {
        return build(resultCode, null);
    }

    /**
     * 失败响应（使用枚举 + 数据）
     */
    public static <T> Result<T> fail(ResultCode resultCode, T data) {
        return build(resultCode, data);
    }

    /**
     * 失败响应（自定义消息）
     */
    public static <T> Result<T> fail(String message) {
        return build(ResultCode.BUSINESS_ERROR.getCode(), message, null);
    }

    /**
     * 失败响应（自定义状态码和消息）
     */
    public static <T> Result<T> fail(Integer code, String message) {
        return build(code, message, null);
    }

    /**
     * 失败响应（自定义状态码、消息和数据）
     */
    public static <T> Result<T> fail(Integer code, String message, T data) {
        return build(code, message, data);
    }

    // ==================== 构建方法 ====================

    /**
     * 构建响应（使用枚举）
     */
    private static <T> Result<T> build(ResultCode resultCode, T data) {
        return build(resultCode.getCode(), resultCode.getMessage(), data);
    }

    /**
     * 构建响应（通用）
     */
    private static <T> Result<T> build(Integer code, String message, T data) {
        Result<T> result = new Result<>();
        result.setCode(code);
        result.setMessage(message);
        result.setData(data);
        result.setTimestamp(System.currentTimeMillis());
        return result;
    }
}
